package com.woniuxy.config.rabbitmq;

import org.springframework.amqp.core.*;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.HashMap;
import java.util.Map;

/**
 * @Author: 马宇航
 * @Description: 最大长度限制的队列，触发死信
 * @DateTime: 25/10/28/星期二 14:03
 * @Component: 成都蜗牛学苑
 **/
@Configuration
public class MaxLengthQueueConfig {
    @Bean
    public Queue maxLengthQueue() {
        /*
         * 1.队列名字
         * 2.是否持久化：队列是否存储在磁盘上，默认是持久化的，里面的数据，如果没有消费，重启后还在（消息防丢失必备的配置）
         * 3.是否排它：是否只能有一个消费者消费，默认是false
         * 4.是否自动删除：当最后一个消费者断开连接之后是否自动删除队列，看里面有没有数据，没有才会删除，默认是false
         * 5.队列参数：可以设置队列的最大长度、消息过期时间、死信交换机、死信路由键等
        */
        Map<String, Object> args = new HashMap<>();
        args.put("x-max-length", 5); //设置最大队列长度
        //设置，丢弃老任务还是新任务 drop-head：丢弃老任务, reject-publish：拒绝发布新任务
        // reject-publish-dlx：拒绝发布新任务并发送到死信交换机
        args.put("x-overflow", "reject-publish-dlx");
        args.put("x-dead-letter-exchange", "deathExchange");
        args.put("x-dead-letter-routing-key", "dead");
        return new Queue("maxLengthQueue", true, false, false,args);
    }
    @Bean
    public Exchange maxLengthExchange() {
        return new DirectExchange("maxLengthExchange", true, false);
    }
    @Bean
    public Binding maxLengthBinding() {
        return BindingBuilder.bind(maxLengthQueue()).to(maxLengthExchange()).with("maxLength").noargs();
    }
}
